//这个文件是对axios进行二次封装
//额外的让axios发送请求时，能够具备其他的功能

//配置基础路径和超时时间
//添加进度条信息   nprogress

import axios from 'axios'

//引入nprogress相关的js和css
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import {getUserTempId} from "@/utils/userabout"

//以后只要是对axios二次封装，不会再axios身上直接去封装，而是创建一个axios实例进行封装

//axios.create()创建一个新的和axios具有相同功能的一个实例
const service = axios.create({
    //配置基础路径和超时时间
    baseURL: '/api',
    timeout:4000,
    headers: {"X-Custom-Header":"foobar"},
})

//添加进度条信息功能 nprogress
//以后如果想对axios添加额外的功能或者是给请求头添加额外的信息必然要使用axios的拦截器


//请求拦截器
service.interceptors.request.use(
    (config) => {
        //config其实就是我们的请求报文
        //这个请求报文，最后一定要返回出去，因为还要继续走下去
        //在这里我们可以添加额外的功能，也可以给请求头添加需要的数据

        NProgress.start();//开启进度条

        config.headers.userTempId = getUserTempId();

        return config;
    }
);

//响应拦截器
//返回的响应不再需要冲data属性中拿数据，而是响应我们需要的数据
//统一处理错误，具体请求可以选择处理或者不处理
service.interceptors.response.use(
    (response) => {
        //response就是我们的响应报文
        //我们也是可以添加额外的功能或者对响应报文进行处理
        NProgress.done();

        return response.data
    },
    (error)=>{
        NProgress.done();
        //可以统一处错误
        alert('发送ajax请求失败'+error.message || "未知错误");

        //统一处理完成之后，这个错误可以让后面继续处理，
        //return Promise.reject(new Error("发送ajax请求失败")); //后面还想继续处理错误，返回失败的promise
        //也可以不让后面处理
        return new Promise(()=>{})  //返回pending状态的promise，代表中断promise这个链
    }
);

export default service  //把封装好的axios实例，暴露出去，后面取用